﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Szamlazz.Utils;
using R = Szamlazz.Data.Request;

namespace Szamlazz.Data
{ 
	/// <summary>
	/// Számla tétel gyűjtemény
	/// </summary>
	public class InvoiceItemCollection : Validatable, IEnumerable<InvoiceItem>
	{
		/// <summary>
		/// Belső tároló lista
		/// </summary>
		internal List<InvoiceItem> Items { get; set; }

		/// <summary>
		/// Konstruktor
		/// </summary>
		public InvoiceItemCollection()
		{
			this.Items = new List<InvoiceItem>();
		}

		/// <summary>
		/// Komponens loggoláskori neve
		/// </summary>
		internal override string Component
		{
			get { return "számla tételek"; }
		}

		/// <summary>
		/// Létrehoz egy új nettó értékből kalkulálódó tételt a számlához
		/// </summary>
		/// <param name="name">Tétel megnevezése</param>
		/// <param name="unit">Mennyiség egysége</param>
		/// <param name="quantity">Mennyisége</param>
		/// <param name="netUnitPrice">Nettó egységár</param>
		/// <param name="tax">Adó fajtája</param>
		/// <returns><see cref="InvoiceItem"/> a létrejövő tétel</returns>
		public InvoiceItem CreateNetBased(string name, string unit, double quantity, double netUnitPrice, VATType tax)
		{
			var item = new InvoiceItem(InvoiceItem.RoundingMode.NetBased);

			item.Name = name;
			item.Unit = unit;
			item.Quantity = quantity;
			item.NetUnitPrice = netUnitPrice;
			item.TaxType = tax;

			item.Calculate();

			this.Items.Add(item);

			return item;
		}

		/// <summary>
		/// Létrehoz egy új bruttó értékből kalkulálódó tételt a számlához
		/// </summary>	
		/// <param name="name">Tétel megnevezése</param>
		/// <param name="unit">Mennyiség egysége</param>
		/// <param name="quantity">Mennyisége</param>
		/// <param name="grossUnitPrice">Bruttó egységár</param>
		/// <param name="tax">Adó fajtája</param>
		/// <returns><see cref="InvoiceItem"/> a létrejövő tétel</returns>

		public InvoiceItem CreateGrossBased(string name, string unit, double quantity, double grossUnitPrice, VATType tax)
		{
			var item = new InvoiceItem(InvoiceItem.RoundingMode.GrossBased);

			item.Name = name;
			item.Unit = unit;
			item.Quantity = quantity;
			item.GrossUnitPrice = grossUnitPrice;
			item.TaxType = tax;

			item.Calculate();

			this.Items.Add(item);

			return item;
		}

		/// <summary>
		/// Eltávolítja az adott tételt a számlatételek közül
		/// </summary>
		/// <param name="item">A tétel</param>
		public void Remove(InvoiceItem item)
		{
			this.Items.Remove(item);
		}

		/// <summary>
		/// Gyűjtemény iterátor
		/// </summary>
		/// <returns></returns>
		public IEnumerator<InvoiceItem> GetEnumerator()
		{
			return this.Items.GetEnumerator();
		}

		System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator()
		{
			return this.GetEnumerator();
		}

		/// <summary>
		/// Létrehozza a kéréshez tartozó XML kommunikációs objektum tömböt
		/// </summary>
		/// <returns></returns>
		internal R.tetelTipus[] CreateForRequest()
		{
			var list = new List<R.tetelTipus>();

			foreach (var item in this.Items)
			{
				list.Add(item.CreateRequest());
			}

			return list.ToArray();
		}

		/// <summary>
		/// Ellenőrzi a gyűjteményben szereplő tételek kötelező mezőit
		/// </summary>
		/// <returns></returns>
		internal override ValidationResult Validate()
		{
			var ret = base.Validate();

			foreach (var item in this.Items)
			{
				ret.Merge(item.Validate());
			}

			return ret;
		}
	}
}
